package cn.tedu.user.management.dao.persist.repository;

import cn.tedu.rtms.commons.pojo.vo.PageData;
import cn.tedu.user.management.pojo.entity.User;
import cn.tedu.user.management.pojo.vo.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 处理用户数据的数据访问接口
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
public interface IUserRepository {

    /**
     * 插入用户数据
     *
     * @param user 用户数据
     * @return 受影响的行数
     */
    int insert(User user);

    /**
     * 批量插入用户数据
     *
     * @param userList 若干个用户数据的集合
     * @return 受影响的行数
     */
    //int insertBatch(List<User> userList);

    /**
     * 根据用户id删除用户数据
     *
     * @param id 用户id
     * @return 受影响的行数
     */
    int deleteById(Long id);

    /**
     * 批量删除用户
     *
     * @param idList 需要删除的若干个用户的id
     * @return 受影响的行数
     */
    //int deleteByIds(Collection<Long> idList);

    /**
     * 根据用户id修改用户的数据
     *
     * @param user 封装了用户id和新的数据的对象
     * @return 受影响的行数
     */
    int updateById(User user);

    /**
     * 统计用户数据的数量
     *
     * @return 用户数据的数量
     */
    //int count();

    /**
     * 根据用户名统计用户数据的数量
     *
     * @param username 用户名
     * @return 匹配用户名的用户数据的数据
     */
    int countByUsername(String username);

    /**
     * 根据用户名统计用户数据的数量
     *
     * @param realName 姓名
     * @return 匹配姓名的用户数据的数据
     */
    int countByRealName(String realName);

    /**
     * 根据手机号码统计用户数据的数量
     *
     * @param phone 手机号码
     * @return 匹配手机号码的用户数据的数据
     */
    int countByPhone(String phone);

    /**
     * 根据电子邮箱统计用户数据的数量
     *
     * @param email 电子邮箱
     * @return 匹配电子邮箱的用户数据的数据
     */
    int countByEmail(String email);

    /**
     * 根据用户id查询用户数据详情
     *
     * @param id 用户id
     * @return 匹配的用户数据详情，如果没有匹配的数据，则返回null
     */
    UserStandardVO getStandardById(Long id);

    /**
     * 根据用户名查询用户的登录信息
     *
     * @param username 用户名
     * @return 匹配的用户的登录信息，如果没有匹配的数据，则返回null
     */
    UserLoginInfoVO getLoginInfoByUsername(String username);

    /**
     * 查询用户数据列表
     *
     * @param pageNum  页码
     * @param pageSize 每页记录数
     * @return 用户数据列表
     */
    PageData<UserListItemVO> list(Integer pageNum, Integer pageSize);

    /**
     * 查询注册数据列表
     *
     * @param pageNum  页码
     * @param pageSize 每页记录数
     * @return 注册数据列表
     */
    PageData<UserListItemVO> regList(Integer pageNum, Integer pageSize);

    /**
     * 查询注册数据列表
     *
     * @return 注册数据列表
     */
    List<UserListItemVO> regList();

    /**
     *
     * 通过关键字查询员工列表
     *
     */
    List<UserListItemVO> selectByKeywords(String keywords);

    /**
     * 根据id修改员工数据
     *
     * @param user 封装了员工id和新数据的对象
     * @return 受影响的行数
     */
    int update(User user);

    /**
     * 统计非某id但名称匹配的数据的数量，用于检查是否存在其它数据使用了相同的名称
     *
     * @param id   员工ID
     * @param username 员工用户名
     * @return 匹配名称但不匹配ID的数据的数量
     */
    int countByUsernameAndNotId(@Param("id") Long id, @Param("username") String username);

    /**
     * 统计非某id但手机匹配的数据的数量，用于检查是否存在其它数据使用了相同的名称
     *
     * @param id   员工ID
     * @param phone 员工手机号
     * @return 匹配手机号但不匹配ID的数据的数量
     */
    int countByPhoneAndNotId(@Param("id") Long id, @Param("phone") String phone);

    /**
     * 统计非某id但电子邮箱匹配的数据的数量，用于检查是否存在其它数据使用了相同的名称
     *
     * @param id   员工ID
     * @param email 员工电子邮箱
     * @return 匹配电子邮箱但不匹配ID的数据的数量
     */
    int countByEmailAndNotId(@Param("id") Long id, @Param("email") String email);


    /*
    * 根据部门职位id查询当前职位人数
    */
    int countBySectionJobId(Long sectionJobId);


    /*
    * 通过姓名查id
    * */
    Long selectIdByRealName(String realName);

    /*
    * 查看当前账号资料
    * */
    UserOwnInfoVO getUserOwnInfoById(Long id);


    /*
    * 根据用户名和姓名查询数量
    * */
    int countByUsernameAndRealName(String username, String realName);

    /*
    * 根据用户名查询id
    * */
    Long getIdByUsername(String username);

    /*
    * 根据id查询weight
    */
    Integer getWeightById(Long id);

    /*
    * 根据id查询工具未归还记录
    */
    int countRentNoReturnById(Long id);

    /*
    * 根据id查询员工角色
    */
    UserRoleStandardVO getUserRoleById(Long id);

    /*
    * 查询员工列表
    */
    List<UserListVO> selectUserList();

    /*
    * 根据id查询数量
    */
    int countById(Long id);
}
